#include "Link_List.h"

// 初始化
Head_Node *Init_Link_List()
{
    // 创建头节点动态内存
    Head_Node *Head_List = (Head_Node *)malloc(sizeof(Head_Node));
    if (Head_List == NULL)
    {
        printf("动态内存创建失败!\n");
        return NULL;
    }
    Head_List->next = NULL;
    return Head_List;
}

// 销毁
void Free_Link_List(Head_Node **Head)
{
    if (*Head == NULL)
    {
        printf("链表为空\n");
        return;
    }

    // 销毁节点
    Node *ptr1 = (*Head)->next;
    Node *ptr2 = ptr1->next;
    for (size_t i = 0; ptr1 != NULL; i++)
    {
        free(ptr1); // 销毁 ptr1 内的地址数据
        ptr1 = ptr2;
        if (ptr2 != NULL)
        {
            ptr2 = ptr1->next; // 保存 ptr1 的下一个数据地址
        }
    }

    // 销毁头节点
    free(*Head);
    *Head = NULL;
}

// 末尾插入
void tail_insert_list(Head_Node *Head, Element_data data)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为空");
        return;
    }

    Node *Next_Node = (Node *)malloc(sizeof(Node)); // 开辟节点动态地址

    static Node **ptr = NULL;
    if (Head->next == NULL) // 第一次在头节点后插入数据
    {
        Next_Node->data = data;
        ptr = &Head->next;
        *ptr = Next_Node;
        Next_Node->next = NULL;
    }
    else
    {
        Next_Node->data = data;
        (*ptr)->next = Next_Node; // 指向下一个节点的地址
        *ptr = Next_Node; 
        Next_Node->next = NULL;
    }
}

// 任意位置插入



// 末尾删除
void tail_del_list(Head_Node ** Head)
{
    Node * ptr = (*Head)->next;
    for (size_t i = 0; ptr->next != NULL; i++)
    {
        ptr = ptr->next;
    }
    free(ptr);
    ptr = NULL;
}


// 任意位置删除

// 遍历
void printf_Link_List(Head_Node *Head)
{
    if (Head == NULL)
    {
        printf("链表为空");
        return;
    }

    Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 学号:%d 成绩:%d\n", ptr->data.name,
               ptr->data.sex, ptr->data.age, ptr->data.id, ptr->data.grade);
        ptr = ptr->next;
    }
}
